/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.entidade.fermojupi.AtoCampo;
import br.com.deployment.entidade.fermojupi.AtoItem;
import br.com.deployment.entidade.humana.Pessoa;
import br.com.deployment.entity.orcamento.Orcamento;
import br.com.deployment.entity.orcamento.OrcamentoAto;
import br.com.deployment.entity.orcamento.OrcamentoCampo;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.AtoCampoServico;
import br.com.deployment.servico.AtoItemServico;
import br.com.deployment.servico.OrcamentoAtoServico;
import br.com.deployment.servico.OrcamentoServico;
import br.com.deployment.servico.UsuarioServico;
import br.com.deployment.utilitario.Caracteres;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.NoResultException;
import javax.servlet.ServletContext;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author roniere
 */
@ManagedBean
@ViewScoped
public class ManagerOrcamento implements Serializable{

    @EJB
    OrcamentoServico orcamentoService;

    @EJB
    AtoCampoServico atoCampoService;
    
    @EJB
    OrcamentoAtoServico orcamentoAtoServico;
    
    @EJB
    AtoItemServico atoItemServico;
    
    @EJB
    private UsuarioServico usuarioServico;
    
    private Orcamento orcamento;
    private OrcamentoAto orcamentoAto;
    private List<OrcamentoAto> orcamentoAtos;
    private List<OrcamentoCampo> orcamentoCampos;
    private List<OrcamentoCampo> orcamentoCamposVisualizar;
    private OrcamentoAto orcamentoAtosSelecionado;
    private boolean salvo;
    private Integer prazo;
    private String tab = "0";

    public ManagerOrcamento() {
    }

    @PostConstruct
    public void init() {
        orcamento = new Orcamento();
        orcamentoAto = new OrcamentoAto();
        orcamentoAtos = new ArrayList<OrcamentoAto>();
        orcamentoCampos = new ArrayList<OrcamentoCampo>();
        orcamentoCamposVisualizar = new ArrayList<OrcamentoCampo>();
        salvo = false;
    }

    public Integer getPrazo() {
        return prazo;
    }

    public void setPrazo(Integer prazo) {
        this.prazo = prazo;
    }

    public String getTab() {
        return tab;
    }

    public void setTab(String tab) {
        this.tab = tab;
    }

    public boolean isSalvo() {
        return salvo;
    }

    public void setSalvo(boolean salvo) {
        this.salvo = salvo;
    }

    public List<OrcamentoCampo> getOrcamentoCamposVisualizar() {
        return orcamentoCamposVisualizar;
    }

    public void setOrcamentoCamposVisualizar(List<OrcamentoCampo> orcamentoCamposVisualizar) {
        this.orcamentoCamposVisualizar = orcamentoCamposVisualizar;
    }

    public OrcamentoAto getOrcamentoAtosSelecionado() {
        return orcamentoAtosSelecionado;
    }

    public void setOrcamentoAtosSelecionado(OrcamentoAto orcamentoAtosSelecionado) {

        this.orcamentoAtosSelecionado = orcamentoAtosSelecionado;
    }

    public List<OrcamentoCampo> getOrcamentoCampos() {
        return orcamentoCampos;
    }

    public void setOrcamentoCampos(List<OrcamentoCampo> orcamentoCampos) {
        this.orcamentoCampos = orcamentoCampos;
    }

    public List<OrcamentoAto> getOrcamentoAtos() {
        return orcamentoAtos;
    }

    public void setOrcamentoAtos(List<OrcamentoAto> orcamentoAtos) {
        this.orcamentoAtos = orcamentoAtos;
    }

    public OrcamentoAto getOrcamentoAto() {
        return orcamentoAto;
    }

    public void setOrcamentoAto(OrcamentoAto orcamentoAto) {
        this.orcamentoAto = orcamentoAto;
    }

    public Orcamento getOrcamento() {
        return orcamento;
    }

    public void setOrcamento(Orcamento orcamento) {
        this.orcamento = orcamento;
    }

    public void salvar() throws ParseException {
        if(!orcamentoAtos.isEmpty()){
            prazo = (prazo == null ? Integer.parseInt(prazo()) : prazo);
            orcamento.setPrazo(prazo);
            orcamento.setOrcamentoAtos(orcamentoAtos);
            orcamento = orcamentoService.salvar(orcamento);
            System.err.println("Orcamento"+orcamento.getId());
            salvo = orcamentoService.getSalvo();
        }else{
            Msg.messagemError("Cadastre Serviços");
        }

    }

    public Orcamento orcamentoToProtocolo() {
        System.err.println("Orcamento  "+orcamento.getOrcamentoAtos());
        if(orcamento.getId() != 0){
            resgatar(orcamento.getId());
        }
        
        prazo = (prazo == null ? Integer.parseInt(prazo()) : prazo);
        orcamento.setPrazo(prazo);
        orcamento.setOrcamentoAtos(orcamentoAtos);       
        
        return orcamento;
    }

    public void resgatar(int id) {
        orcamento = orcamentoService.find(id);
        orcamentoAtos = orcamentoAtoServico.resgatarOrc(orcamento);
        tab = "0";

    }

    public void limparAll() {
        orcamentoAtos = new ArrayList<OrcamentoAto>();
        orcamentoCampos = new ArrayList<OrcamentoCampo>();
        orcamentoAto = new OrcamentoAto();
        orcamento = new Orcamento();

    }

    public void limpar() {
        orcamentoCampos = new ArrayList<OrcamentoCampo>();
        orcamentoAto = new OrcamentoAto();

    }

    public void addServico() {

//        BigDecimal valor = new BigDecimal("0.0");
//
//        if (orcamentoAto.getAtoItem() != null) {
//
//            orcamentoAto.setAtoItem(atoItemDao.find(orcamentoAto.getAtoItem().getId()));
//
//
//            if (!orcamentoCampos.isEmpty()) {
//                for (OrcamentoCampo oc : orcamentoCampos) {
//                    if (oc.getAtoCampo().getCalc()) {
//                        valor = format(oc);
//                    }
//                    oc.setOrcamentoAto(orcamentoAto);
//                }
//            }
//            BigDecimal valorAto = new BigDecimal(0);
//            valorAto = orcamentoService.valorAto(orcamentoAto.getAtoItem(), valor);
//            System.err.println("VALOR"+valorAto);
//            orcamentoAto.setValor(valorAto);
//            orcamentoAto.setOrcamentoCampos(orcamentoCampos);
//            orcamentoAtos.add(orcamentoAto);
//            reinit();
//        } else {
//            Msg.messagemError("O campo 'Ato' é obrigatório");
//        }

            orcamentoAto.setOrcamentoCampos(orcamentoCampos);
            orcamentoAto.setAtoItem(atoItemServico.find(orcamentoAto.getAtoItem().getId()));
            BigDecimal valorAto = new BigDecimal(0);
            System.err.println("Orcamento"+orcamentoAto);
            valorAto = orcamentoService.valorAto(orcamentoAto);
            
            System.err.println("VALOR"+valorAto);
            orcamentoAto.setValor(valorAto);
            orcamentoCampos = orcamentoAto.getOrcamentoCampos();
            orcamentoAtos.add(orcamentoAto);
            reinit();
    }

    private BigDecimal format(OrcamentoCampo oc) {

        if (oc.getAtoCampo().getCalc()) {

                oc.setValor(oc.getValor().replace(".", "").replaceAll(",", "."));
                BigDecimal val = new BigDecimal(oc.getValor());
                return val;
        }

        return null;
    }

    public String somaServicos() throws ParseException {
        BigDecimal sum = BigDecimal.ZERO;

        for (OrcamentoAto oa : orcamentoAtos) {
            if(oa.getValor() != null){
                sum = sum.add(oa.getValor());
            }
        }

        DecimalFormat df = new DecimalFormat("#,##0.00");
        String aux = String.valueOf(df.format(sum));


        return aux;
    }

    public int resgateId(String key){
        FacesContext context = FacesContext.getCurrentInstance();
        Map map = context.getExternalContext().getRequestParameterMap();
        String x = (String) map.get(key);
        int ds = Integer.parseInt(x);
        return ds;
    }
    
    public void dialogShow() {
        
        int ds = resgateId("paramShowOrcAto");
        
        orcamentoAtosSelecionado = new OrcamentoAto();
        
        setOrcamentoAtosSelecionado(orcamentoAtos.get(ds));
        
        gerarCamposVisualizar(orcamentoAtosSelecionado);
    }

    public void dialogClose() {
        orcamentoAtosSelecionado = new OrcamentoAto();
        System.err.println("close");
    }

    public void remover() {
        int ds = resgateId("paramRemoverOrcAto");
        removerList(orcamentoAtos.get(ds));

    }

    public void removerList(OrcamentoAto oAto) {
        orcamentoAtos.remove(oAto);
    }

    public void editarList() {
        int ds = resgateId("paramOrcAto");
        
        orcamentoAto = orcamentoAtos.get(ds);
        if (!orcamentoAto.getOrcamentoCampos().isEmpty()) {
            gerarCampos(orcamentoAto);
        }
        orcamentoAtos.remove(ds);
    }

    public void gerarCampos(OrcamentoAto event) {
        AtoItem atoItem = event.getAtoItem();
        System.err.println(" -- ---- " + atoItem);
        orcamentoAto.setAtoItem(atoItemServico.find(atoItem.getId()));

        orcamentoCampos.clear();
        orcamentoCampos = event.getOrcamentoCampos();
        List<OrcamentoCampo> ocs = new ArrayList<OrcamentoCampo>();
        for (OrcamentoCampo oc : orcamentoCampos) {
            oc.setValor(oc.getValor().replaceAll("\\.", ","));
            ocs.add(oc);
        }

        if (!ocs.isEmpty()) {
            orcamentoCampos = ocs;
        }

    }

    public void gerarCamposVisualizar(OrcamentoAto event) {
        orcamentoCamposVisualizar = event.getOrcamentoCampos();
        List<OrcamentoCampo> ocs = new ArrayList<OrcamentoCampo>();
        for (OrcamentoCampo oc : orcamentoCamposVisualizar) {
            oc.setValor(oc.getValor().replaceAll("\\.", ","));
            ocs.add(oc);
        }

        if (!ocs.isEmpty()) {
            orcamentoCampos = ocs;
        }

    }

    public String prazo() {
        int prazo = 0;

        if (!orcamentoAtos.isEmpty()) {
            prazo = orcamentoAtos.get(0).getAtoItem().getPrazo();
            for (OrcamentoAto oa : orcamentoAtos) {
                if (oa.getAtoItem().getPrazo() > prazo) {
                    prazo = oa.getAtoItem().getPrazo();
                }
            }
        } else {
            return "";
        }
        String x = Integer.toString(prazo);
        System.err.println("Prazo: " + prazo);
        return x;
    }

    public void reinit() {
        orcamentoAto = new OrcamentoAto();
        limpar();
    }

    public void gerarCampos(SelectEvent event) {
System.err.println(" -- ---- ");
        AtoItem atoItem = (AtoItem) event.getObject();
        atoItem = atoItemServico.find(atoItem.getId());

        orcamentoAto.setAtoItem(atoItem);
        List<AtoCampo> atoCampo = atoCampoService.getCampos(atoItem);
        orcamentoCampos.clear();
        System.err.println("Ato campo: "+atoCampo);
        for (AtoCampo ac : atoCampo) {
            OrcamentoCampo oc = new OrcamentoCampo();
            oc.setAtoCampo(ac);
            orcamentoCampos.add(oc);
        }

    }

    public void buscarPessoa() {
        Pessoa p = new Pessoa();
        orcamento.setNome(orcamentoService.findDoc(Caracteres.removecaracter(orcamento.getDoc())).getNome());

    }

    public void handleSelect(SelectEvent event) {
        System.err.println("----" + event.getObject());
    }
    

    public void gerarRelatorioOrcamento(int id) {

        Orcamento orcPrint = orcamentoService.find(id);

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();

        Usuario usuario;
        try {
            usuario = usuarioServico.getUsuario();
        } catch (NoResultException nre) {
            Msg.messagemError("Favor logar-se");
            return;
        } catch (NullPointerException nre) {
            Msg.messagemError("Favor logar-se");
            return;
        }
//            orcPrint.setUsuario(usuario);
        orcPrint.setOrcamentoAtos(orcamentoAtoServico.getOrcamento(orcPrint));
        orcamentoService.imprimirOrcamento(orcPrint, usuario);

    }

    public Integer getValidadeResourceBundle() {
        ResourceBundle resourceBundle;
        resourceBundle = ResourceBundle.getBundle("resources/Messages");
        Integer validade = Integer.parseInt(resourceBundle.getString("validade"));
        return validade;
    }

    public String validade() {
        SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
        Calendar c = new GregorianCalendar();
        c.add(Calendar.DAY_OF_MONTH, getValidadeResourceBundle());
        return sd.format(c.getTime());

    }
}
